package com.net.oil.http;


import com.net.oil.TechnologySupport.bean.TechnologyListBean;
import com.net.oil.action.bean.ActionDetailBean;
import com.net.oil.bean.BaseBean;
import com.net.oil.bean.ListDate;
import com.net.oil.car.bean.CarBean;
import com.net.oil.car.bean.CarBrandBean;
import com.net.oil.car.bean.CarSeriesBean;
import com.net.oil.car.bean.CarTypeBean;
import com.net.oil.coupon.bean.CouponBean;
import com.net.oil.coupon.bean.CouponDetailBean;
import com.net.oil.coupon.bean.CouponList;
import com.net.oil.coupon.bean.CouponRecordVO;
import com.net.oil.coupon.bean.CouponV2Bean;
import com.net.oil.luckPan.bean.LotteryBean;
import com.net.oil.luckPan.bean.LuckPanBean;
import com.net.oil.main.bean.AdBean;
import com.net.oil.main.bean.AppVersionInfo;
import com.net.oil.main.bean.BannerShopBean;
import com.net.oil.main.bean.HomePageInfoBean;
import com.net.oil.main.bean.InitCoupon;
import com.net.oil.main.bean.NewAccountCoupon;
import com.net.oil.main.bean.NewsTypeBean;
import com.net.oil.main.bean.ShopListBean;
import com.net.oil.main.bean.TechnologyTypeBean;
import com.net.oil.message.bean.MessageBean;
import com.net.oil.news.bean.NewsListBean;
import com.net.oil.oilWear.bean.FillOilRecordBean;
import com.net.oil.oilWear.bean.OilWearChartBean;
import com.net.oil.oilWear.bean.OilWearInfo;
import com.net.oil.order.bean.MaintainDetailBean;
import com.net.oil.order.bean.MaintainListBean;
import com.net.oil.order.bean.ReserveBean;
import com.net.oil.order.bean.ReserveBeanV2;
import com.net.oil.order.bean.ReserveDetailBean;
import com.net.oil.product.bean.ProductBean;
import com.net.oil.product.bean.ProductInfoBean;
import com.net.oil.product.bean.ProductListBean;
import com.net.oil.push.bean.NewsDetailBean;
import com.net.oil.push.bean.TechnologySupportDetail;
import com.net.oil.shop.bean.ShopDetailBean;
import com.net.oil.user.bean.CheckPhoneBean;
import com.net.oil.user.bean.OilApplyBusinessProductRecordDetailVO;
import com.net.oil.user.bean.OilApplyBusinessProductRecordVO;
import com.net.oil.user.bean.RecommendBean;
import com.net.oil.user.bean.RegisterBean;
import com.net.oil.user.bean.UserInfo;

import java.util.List;

import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.Multipart;
import retrofit2.http.POST;
import retrofit2.http.Part;
import retrofit2.http.Query;
import retrofit2.http.Streaming;
import retrofit2.http.Url;

/**
 * Created by lch on 2018/2/10 0010.
 * 邮箱:245850413@qq.com
 */

public interface AppApi {

    /**
     * 检查手机号是否已经注册
     *
     * @param phone 手机号
     * @return Observable
     */
    @GET("/Oil/app/check/phone")
    Observable<BaseBean<CheckPhoneBean>> checkPhone(@Query("phone") String phone);

    /**
     * 验证手机验证码是否正确
     *
     * @param phone 手机号
     * @param code  验证码
     * @return Observable
     */
    @GET("/Oil/app/verificate/phonecode")
    Observable<BaseBean> verifyCode(@Query("phone") String phone, @Query("code") String code);

    /**
     * 获取手机验证码
     *
     * @param phone 手机号
     * @param ptt   是否是语音
     * @return Observable
     */
    @GET("/Oil/app/get/phone/code")
    Observable<BaseBean> getPhoneCode(@Query("phone") String phone, @Query("ptt") boolean ptt);

    /**
     * 注册
     *
     * @param phone           手机号
     * @param password        密码
     * @param nick            昵称
     * @param invitationPhone 推荐人手机号，没有则为空
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/auth/registe")
    Observable<BaseBean<RegisterBean>> register(@Field("phone") String phone, @Field("password") String password,
                                                @Field("nick") String nick, @Field("invitationPhone") String invitationPhone);

    /**
     * 注册v2
     *
     * @param phone           手机号
     * @param password        密码
     * @param nick            昵称
     * @param invitationPhone 推荐人手机号，没有则为空
     * @param email           邮箱，没有则为空
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/auth/registe/v2")
    Observable<BaseBean<UserInfo>> registerV2(@Field("phone") String phone, @Field("password") String password,
                                              @Field("nick") String nick, @Field("invitationPhone") String invitationPhone, @Field("email") String email);

    /**
     * 登陆
     *
     * @param phone    手机号
     * @param password 密码
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/auth/login/v2")
    Observable<BaseBean<UserInfo>> login(@Field("phone") String phone, @Field("password") String password);

    /**
     * 通过验证码登陆
     *
     * @param phone 手机号
     * @param code  验证码
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/auth/login/by/phonecode")
    Observable<BaseBean<UserInfo>> loginByAuthCode(@Field("phone") String phone, @Field("code") String code);

    /**
     * 根据验证码重置密码
     *
     * @param phone       手机号
     * @param code        验证码
     * @param newPassword 新密码
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/auth/reset/password")
    Observable<BaseBean> resetPassword(@Field("phone") String phone, @Field("code") String code, @Field("newPassword") String newPassword);

    /**
     * 修改密码
     *
     * @param oldpwd 旧密码
     * @param newpwd 新密码
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/auth/update/password")
    Observable<BaseBean> changePassword(@Field("oldpwd") String oldpwd, @Field("newpwd") String newpwd);

    /**
     * 退出登陆接口
     *
     * @return Observable
     */
    @POST("/Oil/app/auth/logout")
    Observable<BaseBean> logout();

    /**
     * 查询所有新闻的类型
     *
     * @return Observable
     */
    @GET("/Oil/app/article/category/list")
    Observable<BaseBean<List<NewsTypeBean>>> getNewsType();

    /**
     * 获取新闻列表
     *
     * @param categoryId 新闻类型id
     * @param page       当前分页的页码
     * @param rows       分页大小
     * @return Observable
     */
    @GET("/Oil/app/article/list")
    Observable<BaseBean<NewsListBean>> getNewsList(@Query("categoryId") int categoryId, @Query("page") int page, @Query("rows") int rows);

    /**
     * 获取商家列表
     *
     * @param province 省
     * @param county   县/区
     * @param city     城市
     * @param name     商家名称模糊查询
     * @param lng      当前位置纬度
     * @param lat      当前位置经度
     * @param page     页码
     * @param rows     分页大小
     * @return Observable
     */
    @GET("/Oil/app/business/list")
    Observable<BaseBean<ShopListBean>> getShopList(@Query("province") String province, @Query("city") String city,
                                                   @Query("county") String county, @Query("name") String name, @Query("lng") double lng,
                                                   @Query("lat") double lat, @Query("page") int page, @Query("rows") int rows);

    /**
     * 根据id，获取商家详细信息
     *
     * @param id id
     * @return Observable
     */
    @GET("/Oil/app/business/detail")
    Observable<BaseBean<ShopDetailBean>> getShopDetail(@Query("id") int id);

    /**
     * 获取产品分类数据
     *
     * @param parentId 产品分类id，默认传0，与后台协定
     * @return Observable
     */
    @GET("/Oil/app/product/category/list")
    Observable<BaseBean<ProductBean>> getProductData(@Query("parentId") int parentId);

    /**
     * 根据产品类别id，获取产品列表
     *
     * @param categoryId 分类id
     * @param name       产品名称（模糊查询），可以不传
     * @param page       当前页
     * @param rows       分页大小
     * @return Observable
     */
    @GET("/Oil/app/product/list")
    Observable<BaseBean<ProductListBean>> getProductList(@Query("categoryId") int categoryId, @Query("name") String name,
                                                         @Query("page") int page, @Query("rows") int rows);

    /**
     * 获取首页数据
     *
     * @return Observable
     */
    @GET("/Oil/app/home/page/info")
    Observable<BaseBean<HomePageInfoBean>> getHomePageInfo();

    /**
     * 获取品牌列表
     *
     * @return Observable
     */
    @GET("/Oil/app/brand/list")
    Observable<BaseBean<List<CarBrandBean>>> getCarBrandList();


    /**
     * 获取活动详情
     *
     * @param actionId 活动id
     * @return Observable
     */
    @GET("/Oil/app/action/detail")
    Observable<BaseBean<ActionDetailBean>> getActionDetail(@Query("actionId") int actionId);

    /**
     * 领取优惠券
     *
     * @param actionId 活动id
     * @return Observable
     */
    @GET("/Oil/app/action/apply")
    Observable<BaseBean> getCoupon(@Query("actionId") int actionId);

    /**
     * 获取车系列表
     *
     * @param brandId 品牌id
     * @return Observable
     */
    @GET("/Oil/app/carsystem/list")
    Observable<BaseBean<List<CarSeriesBean>>> getCarSeriesList(@Query("brandId") int brandId);

    /**
     * 获取车型列表
     *
     * @param carSysId 车系id
     * @return Observable
     */
    @GET("/Oil/app/carmodel/list")
    Observable<BaseBean<List<CarTypeBean>>> getCarTypeList(@Query("carSysId") int carSysId);

    /**
     * 添加爱车
     *
     * @param modelId 车型id
     * @param carno 车牌号
     * @return Observable
     */
    @POST("/Oil/app/mycar/add")
    Observable<BaseBean> addCar(@Query("modelId") int modelId, @Query("carno") String carno);

    /**
     * 获取爱车列表
     *
     * @return Observable
     */
    @GET("/Oil/app/mycar/list")
    Observable<BaseBean<List<CarBean>>> getMyCarList();

    /**
     * 把爱车设为默认
     *
     * @param id 爱车id
     * @return Observable
     */
    @POST("/Oil/app/mycar/set/default")
    Observable<BaseBean> setDefaultCar(@Query("id") int id);

    /**
     * 删除爱车
     *
     * @param id 爱车id
     * @return Observable
     */
    @POST("/Oil/app/mycar/delete")
    Observable<BaseBean> deleteCar(@Query("id") int id);

    /**
     * 编辑我的车辆信息
     *
     * @param id                 我的爱车id
     * @param registNumber       车牌号
     * @param modelId            车型id
     * @param buyTime            购车时间
     * @param mileage            行驶公里数
     * @param identificationCode 车架号
     * @param oilName            上次使用的机油名称
     * @param gearboxOilName     上次使用的变速箱油
     * @param nextKeepCarDate    下次保养时间
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/mycar/update")
    Observable<BaseBean> updateCarInfo(@Field("id") int id, @Field("registNumber") String registNumber, @Field("modelId") int modelId,
                                       @Field("buyTime") String buyTime, @Field("mileage") int mileage, @Field("identificationCode") String identificationCode,
                                       @Field("oilName") String oilName, @Field("gearboxOilName") String gearboxOilName, @Field("nextKeepCarDate") String nextKeepCarDate);


    /**
     * 上传极光推送id
     *
     * @param deviceId   id
     * @param deviceType 设备类型ID（1：安卓 2：IOS）
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/push/register/device")
    Observable<BaseBean> postJPushId(@Field("deviceId") String deviceId, @Field("deviceType") int deviceType);

    /**
     * 获取消息列表
     *
     * @param page     当前页
     * @param pageSize 分页大小
     * @return Observable
     */
    @GET("/Oil/app/push/message/list")
    Observable<BaseBean<MessageBean>> getMessageList(@Query("page") int page, @Query("pageSize") int pageSize);

    /**
     * 上传图片
     *
     * @param file 图片
     * @return Observable
     */
    @Multipart
    @POST("/Oil/app/resource")
    Observable<BaseBean<String>> uploadImage(@Part MultipartBody.Part file);

    /**
     * 获取技术支持分类
     *
     * @return Observable
     */
    @GET("/Oil/app/technicalSupport/article/category/list")
    Observable<BaseBean<List<TechnologyTypeBean>>> getTechnologyType();

    /**
     * 获取技术支持列表
     *
     * @param categoryId 分类id
     * @param page       当前页
     * @param rows       分页大小
     * @return Observable
     */
    @GET("/Oil/app/technicalSupport/article/list")
    Observable<BaseBean<TechnologyListBean>> getTechnologyList(@Query("categoryId") int categoryId,
                                                               @Query("page") int page, @Query("rows") int rows);

    /**
     * 根据产品id查询产品信息
     *
     * @param id id
     * @return Observable
     */
    @GET("/Oil/app/product/detail")
    Observable<BaseBean<ProductInfoBean>> getProductDetail(@Query("id") int id);

    /**
     * 根据技术支援文章id查询技术支援文章信息（主要用于推送过来的技术支援文章id）
     *
     * @param id 技术支援文章id
     * @return Observable
     */
    @GET("/Oil/app/technicalSupport/article/detail")
    Observable<BaseBean<TechnologySupportDetail>> getTechnologySupportDetail(@Query("id") int id);

    /**
     * 根据新闻id查询新闻详情（主要用于推送过来的新闻id）
     *
     * @param id 新闻id
     * @return Observable
     */
    @GET("/Oil/app/article/detail")
    Observable<BaseBean<NewsDetailBean>> getNewsDetail(@Query("id") int id);

    /**
     * 更新用户头像资源id
     *
     * @param resourceId 资源id，用户上传图片完成后返回
     * @return Observable
     */
    @POST("/Oil/app/user/set/portrait/v2")
    Observable<BaseBean> setUserHeadId(@Query("resourceId") String resourceId);

    /**
     * 获取我的预约列表
     *
     * @return Observable
     */
    @GET("/Oil/app/appointment/list")
    Observable<BaseBean<List<ReserveBean>>> getReserveList();

    /**
     * 获取我的预约列表V2
     *
     * @return Observable
     */
    @GET("/Oil/app/appointment/list/v2")
    Observable<BaseBean<ReserveBeanV2>> getReserveListV2(@Query("page") int page, @Query("rows") int rows);

    /**
     * 获取预约详情
     *
     * @param id id
     * @return Observable
     */
    @GET("/Oil/app/appointment/detail")
    Observable<BaseBean<ReserveDetailBean>> getReserveDetail(@Query("id") int id);

    /**
     * 获取优惠券列表
     *
     * @param used 使用状态(1:已使用 0：未使用 -1：已过期)
     * @param page 分页
     * @param rows 分页大小
     * @return Observable
     */
    @GET("/Oil/app/appliment/list")
    Observable<BaseBean<List<CouponBean>>> getCouponList(@Query("used") int used, @Query("page") int page, @Query("rows") int rows);

    /**
     * 获取优惠券列表v2
     *
     * @param used 使用状态(1:已使用 0：未使用 -1：已过期)
     * @param page 分页
     * @param rows 分页大小
     * @return Observable
     */
    @GET("/Oil/app/appliment/list/v2")
    Observable<BaseBean<CouponV2Bean>> getCouponListV2(@Query("used") int used, @Query("page") int page, @Query("rows") int rows);

    /**
     *获取优惠券列表v3
     */
    @GET("/Oil/app/coupon/record/list")
    Observable<BaseBean<CouponList>> getCouPonListV3(@Query("used") int used, @Query("page") int page, @Query("rows") int rows);

    /**
     * 获取优惠券详情
     * @param id    优惠券id
     * @return  Observable
     */
    @GET("/Oil/app/coupon/record/detail")
    Observable<BaseBean<CouponRecordVO>> getCouponDetailV2(@Query("id") int id);

    /**
     * 用户填写用户反馈
     *
     * @param content 内容
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/user/feedback/save")
    Observable<BaseBean> commitFeedback(@Field("content") String content);

    /**
     * 根据商家id预约保养,预约的时候要选择一辆爱车，把我的爱车中的id传到userCarId参数中
     *
     * @param bid             商家id
     * @param appointmentTime 预约时间
     * @param userCarId       爱车id
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/business/appointmentedV2")
    Observable<BaseBean> reserveOrder(@Field("bid") int bid, @Field("appointmentTime") String appointmentTime, @Field("userCarId") int userCarId);

    /**
     * 修改昵称
     *
     * @param nick 昵称
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/user/nick/update")
    Observable<BaseBean> updateNick(@Field("nick") String nick);

    /**
     * 根据id取消预约
     *
     * @param id id
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/business/appointmented/cancel")
    Observable<BaseBean> cancelReserve(@Field("id") int id);

    /**
     * 获取启动页图片列表
     *
     * @return Observable
     */
    @GET("/Oil/app/launchPage/list")
    Observable<BaseBean<List<AdBean>>> getAdList();

    /**
     * 删除通知消息
     *
     * @param id 消息id
     * @return Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/push/message/delete")
    Observable<BaseBean> deleteMessage(@Field("id") int id);

    /**
     * 获取优惠券详情
     *
     * @param id 优惠券id
     * @return Observable
     */
    @GET("/Oil/app/appliment/detail")
    Observable<BaseBean<CouponDetailBean>> getCouponDetail(@Query("id") int id);

    /**
     * 获取保养记录列表
     *
     * @return Observable
     */
    @GET("/Oil/app/mycar/maintain/record/list")
    Observable<BaseBean<MaintainListBean>> getMainList(@Query("myCarId") int myCarId, @Query("page") int page, @Query("rows") int rows);

    /**
     * 获取保养记录详情
     *
     * @param id 记录id
     * @return Observable
     */
    @GET("/Oil/app/mycar/maintain/record/detail")
    Observable<BaseBean<MaintainDetailBean>> getMaintainDetail(@Query("id") int id);

    /**
     * 获取推荐人列表
     *
     * @param page 当前页
     * @param rows 分页大小
     * @return Observable
     */
    @GET("/Oil/app/invitation/list")
    Observable<BaseBean<ListDate<RecommendBean>>> getRecommendList(@Query("page") int page, @Query("rows") int rows);

    /**
     * 完善推荐人信息
     *
     * @param invitationPhone 推荐人手机号
     * @return Observable
     */
    @GET("/Oil/app/invitation/improve")
    Observable<BaseBean> sendRecommendUserInfo(@Query("invitationPhone") String invitationPhone);

    /**
     * 我领取的产品券
     *
     * @param used 到店领取状态(1:已到店领取 0：未领取 -1：已过期)
     * @param page 当前页
     * @param rows 分页大小
     * @return Observable
     */
    @GET("/Oil/app/product/action/apply/list/v2")
    Observable<BaseBean<ListDate<OilApplyBusinessProductRecordVO>>> getMyReceiveGoods(@Query("used") int used, @Query("page") int page, @Query("rows") int rows);

    /**
     * 我领取产品的详情
     *
     * @param id 商品id
     * @return Observable
     */
    @GET("/Oil/app/product/action/apply/detail/v2")
    Observable<BaseBean<OilApplyBusinessProductRecordDetailVO>> getMyReceiveGoodsDetail(@Query("id") int id);


    /**
     * 初始化抽奖转盘数据
     *
     * @param actionId 抽奖活动id
     * @return Observable
     */
    @GET("/Oil/app/action/lottery/init")
    Observable<BaseBean<LuckPanBean>> initLuckPan(@Query("actionId") int actionId);

    /**
     * 抽奖
     *
     * @param actionId 活动id
     * @return Observable
     */
    @GET("/Oil/app/action/lottery/award")
    Observable<BaseBean<LotteryBean>> lottery(@Query("actionId") int actionId);

    /**
     * 获取加油记录
     *
     * @param myCarId 车辆id
     * @param page    分页 页码
     * @return Observable
     */
    @GET("/Oil/app/mycar/fuel/record/list")
    Observable<BaseBean<FillOilRecordBean>> fillOilRecord(@Query("myCarId") int myCarId, @Query("page") int page);

    /**
     * 删除加油记录
     *
     * @param id 记录id
     * @return Observable
     */
    @POST("/Oil/app/mycar/fuel/record/delete")
    Observable<BaseBean> deleteFillOilRecord(@Query("id") int id);

    /**
     * 获取加油计算详情
     *
     * @param myCarId 车辆id
     * @return Observable
     */
    @GET("/Oil/app/mycar/fuel/info")
    Observable<BaseBean<OilWearInfo>> getOilWearInfo(@Query("myCarId") int myCarId);

    /**
     * 获取加油计算详情下面的折线图
     *
     * @param myCarId  车辆id
     * @param selectId 筛选条件3:3个月 6:半年 12：一年
     * @return Observable
     */
    @GET("/Oil/app/mycar/fuel/info/for/brokenline")
    Observable<BaseBean<List<OilWearChartBean>>> getOilWearChartData(@Query("myCarId") int myCarId, @Query("selectId") int selectId);

    /**
     * 添加加油记录
     *
     * @param myCarId        车辆id
     * @param currentMileage 当前行驶里程
     * @param quantity       加油总量（升）
     * @param price          油价
     * @param oilMoney       加油总共花了多少钱
     * @param date           加油日期
     * @return Observable
     */
    @POST("/Oil/app/mycar/fuel/record/add")
    Observable<BaseBean> addFillOilRecord(@Query("myCarId") int myCarId, @Query("currentMileage") int currentMileage, @Query("quantity") double quantity,
                                          @Query("price") double price, @Query("oilMoney") double oilMoney, @Query("date") String date);

    /**
     * 编辑加油记录
     *
     * @param id             加油记录id
     * @param currentMileage 当前行驶里程
     * @param quantity       加油总量（升）
     * @param price          油价
     * @param oilMoney       加油总共花了多少钱
     * @return Observable
     */
    @POST("/Oil/app/mycar/fuel/record/update")
    Observable<BaseBean> updateFillOilRecord(@Query("id") int id, @Query("currentMileage") int currentMileage, @Query("quantity") double quantity,
                                             @Query("price") double price, @Query("oilMoney") double oilMoney);

    /**
     * 获取新用户注册赠送的优惠券列表
     *
     * @return Observable
     */
    @GET("/Oil/app/for/newuser/action/list")
    Observable<BaseBean<List<NewAccountCoupon>>> searchNewAccountCoupon();

    /**
     * 领取新用户注册赠送的优惠券
     *
     * @param id 优惠券id
     * @return Observable
     */
    @POST("/Oil/app/for/newuser/action/apply")
    Observable<BaseBean> getNewAccountCoupon(@Query("actionId") int id);

    /**
     * 获取用户是否有未领取的优惠券
     *
     * @return Observable
     */
    @GET("/Oil/app/coupon/market/init")
    Observable<BaseBean<InitCoupon>> initCoupon();

    /**
     * 注销账号
     *
     * @return Observable
     */
    @POST("/Oil/app/auth/cancellation")
    Observable<BaseBean> deleteAccount(@Query("phone") String phone, @Query("password") String password, @Query("code") String code);

    /**
     * 获取banner商家列表
     *
     * @return Observable
     */
    @GET("/Oil/app/business/loop/list")
    Observable<BaseBean<List<BannerShopBean>>> getBannerShopList();

    /**
     * 获取服务器端app版本，判断是否有新的版本
     *
     * @return Observable
     */
    @GET("Oil/app/platform/version")
    Observable<BaseBean<AppVersionInfo>> getVersion();

    //下载静态文件
    @Streaming
    @GET
    Observable<ResponseBody> down(@Url String url);

    /**
     * 提交保养记录评论
     *
     * @param id          记录id
     * @param score       评分
     * @param commentDesc 评论内容
     * @return  Observable
     */
    @FormUrlEncoded
    @POST("/Oil/app/mycar/maintain/record/comment")
    Observable<BaseBean> commitComment(@Field("id") int id, @Field("score") int score, @Field("commentDesc") String commentDesc);



}
